﻿using System;
using System.Diagnostics;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;

namespace Print
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] Args)
        {


            //bool createdNew;

            ////系统能够识别有名称的互斥，因此可以使用它禁止应用程序启动两次
            ////第二个参数可以设置为产品的名称:Application.ProductName
            ////每次启动应用程序，都会验证名称为SingletonWinAppMutex的互斥是否存在
            //Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);
            //StaffData.createdNew = createdNew;
            ////如果已运行，则在前端显示
            ////createdNew == false，说明程序已运行
            //if (!createdNew)
            //{
            //    Process instance = GetExistProcess();
            //    if (instance != null)
            //    {
            //        //SetForegroud(instance);

            //        Application.Exit();
            //        return;
            //    }
            //}


            ////Application.EnableVisualStyles();
            ////Application.SetCompatibleTextRenderingDefault(false);
            ////Application.Run(new Login());

            /** 
            * 当前用户是管理员的时候，直接启动应用程序 
            * 如果不是管理员，则使用启动对象启动程序，以确保使用管理员身份运行 
            */
            //获得当前登录的Windows用户标示  
            //System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            ////创建Windows用户主题  
            //Application.EnableVisualStyles();

            //System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            ////判断当前登录用户是否为管理员  
            //if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            //{
            //    //如果是管理员，则直接运行  

            //    Application.EnableVisualStyles();
            //    Application.Run(new Login());
            //}
            //else
            //{
            //    //创建启动对象  
            //    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            //    //设置运行文件  Z
            //    startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
            //    //设置启动参数  
            //    startInfo.Arguments = String.Join(" ", Args);
            //    //设置启动动作,确保以管理员身份运行  
            //    startInfo.Verb = "runas";
            //    //如果不是管理员，则启动UAC  
            //    System.Diagnostics.Process.Start(startInfo);
            //    //退出  
            //    System.Windows.Forms.Application.Exit();
            //}
            //bool isRuned=true;
            //Process[] ps = Process.GetProcesses();
            //foreach (Process item in ps)
            //{
            //    if (item.ProcessName == "Print")
            //    {
            //        MessageBox.Show("有");
            //        isRuned = false;
            //    }
            //}

           
           // System.Threading.Mutex mutex = new System.Threading.Mutex(true, "SingletonWinAppMutex", out isRuned);
            //if (isRuned)
            //{

            //    System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //    //创建Windows用户主题  
            //    Application.EnableVisualStyles();

            //    System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            //    //判断当前登录用户是否为管理员  
            //    if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            //    {
            //        //如果是管理员，则直接运行  

            //        Application.EnableVisualStyles();
            //        Application.Run(new Login());
            //    }
            //    else
            //    {
            //        //创建启动对象  
            //        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            //        //设置运行文件  Z
            //        startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
            //        //设置启动参数  
            //        startInfo.Arguments = String.Join(" ", Args);
            //        //设置启动动作,确保以管理员身份运行  
            //        startInfo.Verb = "runas";
            //        //如果不是管理员，则启动UAC  
            //        System.Diagnostics.Process.Start(startInfo);
            //        //退出  
            //        System.Windows.Forms.Application.Exit();
            //    }
            //}

            Process instance = RunningInstance();
            if (instance == null)
            {
                //没有实例在运行
                //Application.Run(new Login());
                System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
                //创建Windows用户主题  
                Application.EnableVisualStyles();

                System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
                //判断当前登录用户是否为管理员  
                if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
                {
                    //如果是管理员，则直接运行  

                    Application.EnableVisualStyles();
                    Application.Run(new Login());
                }
                else
                {
                    //创建启动对象  
                    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                    //设置运行文件  Z
                    startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                    //设置启动参数  
                    startInfo.Arguments = String.Join(" ", Args);
                    //设置启动动作,确保以管理员身份运行  
                    startInfo.Verb = "runas";
                    //如果不是管理员，则启动UAC  
                    System.Diagnostics.Process.Start(startInfo);
                    //退出  
                    System.Windows.Forms.Application.Exit();
                }
            }
            else
            {
                //已经有一个实例在运行
                HandleRunningInstance(instance);
            }


        }
        private static void HandleRunningInstance(Process instance)
        {
          //  MessageBox.Show("已经在运行！", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //ShowWindowAsync(instance.MainWindowHandle, 1);  //调用api函数，正常显示窗口
            //SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端
        }
        private static Process RunningInstance()
        {
            Process current = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcessesByName(current.ProcessName);
            //遍历与当前进程名称相同的进程列表  
            foreach (Process process in processes)
            {
                //如果实例已经存在则忽略当前进程  
                if (process.Id != current.Id)
                {
                    //保证要打开的进程同已经存在的进程来自同一文件路径
                    if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                    {
                        //返回已经存在的进程
                        return process;

                    }
                }
            }
            return null;
        }
        private static Process GetExistProcess()
        {
            Process currentProcess = Process.GetCurrentProcess();
            foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
            {
                if ((process.Id != currentProcess.Id) &&
                    (Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))
                {
                    return process;
                }
            }
            return null;
        }
    }
}
